package com.javaxiaobear.module.system.mapper;

import static com.javaxiaobear.module.system.domain.table.SysDeptTableDef.SYS_DEPT;
import static com.javaxiaobear.module.system.domain.table.SysRoleDeptTableDef.SYS_ROLE_DEPT;

import com.javaxiaobear.module.system.domain.SysDept;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.query.QueryChain;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain;
import java.util.List;

/**
 * 部门管理 数据层
 *
 * @author javaxiaobear
 */
public interface SysDeptMapper extends BaseMapper<SysDept> {
  /**
   * 查询部门管理数据
   *
   * @param dept 部门信息
   * @return 部门信息集合
   */
  default List<SysDept> selectDeptList(SysDept dept) {
    QueryWrapper queryWrapper = QueryWrapper.create().eq(SysDept::getDelFlag, "0");

    if (dept.getDeptId() != null && dept.getDeptId() != 0) {
      queryWrapper.eq(SysDept::getDeptId, dept.getDeptId());
    }

    if (dept.getParentId() != null && dept.getParentId() != 0) {
      queryWrapper.eq(SysDept::getParentId, dept.getParentId());
    }

    if (dept.getDeptName() != null && !dept.getDeptName().isEmpty()) {
      queryWrapper.like(SysDept::getDeptName, dept.getDeptName());
    }

    if (dept.getStatus() != null && !dept.getStatus().isEmpty()) {
      queryWrapper.eq(SysDept::getStatus, dept.getStatus());
    }

    // 数据范围过滤会由框架自动处理

    queryWrapper.orderBy(SysDept::getParentId, true).orderBy(SysDept::getOrderNum, true);

    return selectListByQuery(queryWrapper);
  }

  /**
   * 根据角色ID查询部门树信息
   *
   * @param roleId 角色ID
   * @param deptCheckStrictly 部门树选择项是否关联显示
   * @return 选中部门列表
   */
  default List<Long> selectDeptListByRoleId(Long roleId, boolean deptCheckStrictly) {
    QueryWrapper queryWrapper =
        QueryWrapper.create()
            .select(SysDept::getDeptId)
            .from(SysDept.class)
            .leftJoin(SYS_ROLE_DEPT)
            .on(SYS_ROLE_DEPT.DEPT_ID.eq(SYS_DEPT.DEPT_ID))
            .eq("rd.role_id = ?", roleId);

    if (deptCheckStrictly) {
      queryWrapper.and(
          "d.dept_id not in (select d.parent_id from sys_dept d inner join sys_role_dept rd on d.dept_id = rd.dept_id and rd.role_id = ?)",
          roleId);
    }

    queryWrapper.orderBy("d.parent_id", true).orderBy("d.order_num", true);

    return this.selectListByQueryAs(queryWrapper, Long.class);
  }

  /**
   * 根据部门ID查询信息
   *
   * @param deptId 部门ID
   * @return 部门信息
   */
  default SysDept selectDeptById(Long deptId) {
    return selectOneWithRelationsByQuery(QueryWrapper.create().eq(SysDept::getDeptId, deptId));
  }

  /**
   * 根据ID查询所有子部门
   *
   * @param deptId 部门ID
   * @return 部门列表
   */
  default List<SysDept> selectChildrenDeptById(Long deptId) {
    return QueryChain.of(this).where("find_in_set(?, ancestors)", deptId).list();
  }

  /**
   * 根据ID查询所有子部门（正常状态）
   *
   * @param deptId 部门ID
   * @return 子部门数
   */
  default int selectNormalChildrenDeptById(Long deptId) {
    return Math.toIntExact(
        selectCountByQuery(
            QueryWrapper.create()
                .eq(SysDept::getStatus, "0")
                .and("find_in_set(?, ancestors)", deptId)));
  }

  /**
   * 是否存在子节点
   *
   * @param deptId 部门ID
   * @return 结果
   */
  default int hasChildByDeptId(Long deptId) {
    return Math.toIntExact(
        selectCountByQuery(QueryWrapper.create().eq(SysDept::getParentId, deptId).limit(1)));
  }

  /**
   * 查询部门是否存在用户
   *
   * @param deptId 部门ID
   * @return 结果
   */
  default int checkDeptExistUser(Long deptId) {
    return Math.toIntExact(selectCountByQuery(QueryWrapper.create().eq("dept_id", deptId)));
  }

  /**
   * 校验部门名称是否唯一
   *
   * @param deptName 部门名称
   * @param parentId 父部门ID
   * @return 结果
   */
  default SysDept checkDeptNameUnique(String deptName, Long parentId) {
    return selectOneByQuery(
        QueryWrapper.create().eq("dept_name", deptName).eq("parent_id", parentId).limit(1));
  }

  /**
   * 新增部门信息
   *
   * @param dept 部门信息
   * @return 结果
   */
  default int insertDept(SysDept dept) {
    return this.insert(dept);
  }

  /**
   * 修改部门信息
   *
   * @param dept 部门信息
   * @return 结果
   */
  default int updateDept(SysDept dept) {
    return this.update(dept);
  }

  /**
   * 修改所在部门正常状态
   *
   * @param deptIds 部门ID组
   */
  default void updateDeptStatusNormal(Long[] deptIds) {
    UpdateChain.of(this).set(SysDept::getStatus, "0").in(SysDept::getDeptId, deptIds).update();
  }

  /**
   * 修改子元素关系
   *
   * @param depts 子元素
   * @return 结果
   */
  default void updateDeptChildren(List<SysDept> depts) {
    for (SysDept dept : depts) {
      UpdateChain.of(this)
          .set(SysDept::getAncestors, dept.getAncestors())
          .eq(SysDept::getDeptId, dept.getDeptId())
          .update();
    }
  }

  /**
   * 删除部门管理信息
   *
   * @param deptId 部门ID
   * @return 结果
   */
  default int deleteDeptById(Long deptId) {
    return deleteById(deptId);
  }
}
